﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

/*深入理解指针2*/


/*
数组名就代表数组第一个元素的地址
*/
//int main()
//{
//	int a[10] = { 0 };
//	printf("a\t=\t%p\n",a);
//	printf("&a[0]\t=\t%p\n", &a[0]);
//	return 0;
//}

/*
* 
• sizeof(数组名)，sizeof中单独放数组名，这⾥的数组名表⽰整个数组，计算的是整个数组的⼤⼩，
单位是字节
• &数组名，这⾥的数组名表⽰整个数组，取出的是整个数组的地址（整个数组的地址和数组⾸元素
的地址是有区别的
*/

//int main()
//{
//	int a[10] = { 0 };
//	printf("sizeof(a)\t\t=\t%zd\n", sizeof(a));
//	printf("a\t\t\t=\t%p\n", a);
//	printf("a+1\t\t\t=\t%p\n\n", a+1);//数组名的/地址步进是4字节（int*1）
//
//	printf("sizeof(&a)\t\t=\t%zd\n", sizeof(&a));
//	printf("&a\t\t\t=\t%p\n", &a);
//	printf("&a+1\t\t\t=\t%p\n\n", &a+1);//数组名的地址的/地址步进是40字节（int*10）
//
//	printf("sizeof(a[0])\t\t=\t%zd\n", sizeof(a[0]));
//	printf("sizeof(&a[0])\t\t=\t%zd\n", sizeof(&a[0]));
//	printf("&a[0]\t\t\t=\t%p\n", &a[0] );
//	printf("&a[1]\t\t\t=\t%p\n\n", &a[1]);//数组元素的/地址步进是4字节（int*1）
//	return 0;
//}

/*
*
使⽤指针访问数组
*/
//int main()
//{
//	int a[5] = { 0 };
//	
//	int sz = sizeof(a) / sizeof(a[0]);
//
//	int* p = a;
//	printf("请输入数据填充a[%d]数组：\n", sz);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("请输入第a[%d]个数字：\n", i);
//		//scanf("%d", a + i);
//		//scanf("%d", &a[i]);
//		scanf("%d", p+i);
//	}
//	for (int i = 0; i < sz; i++)
//	{
//		//printf("a[%d] = %d\t", i,*(a + i));
//		//printf("a[%d] = %d\t", i, a[i]);
//		//本质上p[i]是等价于*(p+i)。
//		printf("a[%d] = %d\t", i, p[i]);
//	}
//
//	return 0;
//}

/*
*
⼀维数组传参的本质
本质上数组传参传递的是数组⾸元素的地址
*/
//void text1(int a[])
//{
//	int sz_1 = sizeof(a) / sizeof(a[0]);
//	printf("函数内计算数组大小为：%d\n", sz_1);
//	printf("sizeof(a)=%zd\n", sizeof(a));
//	printf("sizeof(a[0])=%zd\n", sizeof(a[0]));
//}
//
//int main()
//{
//	int a[5] = { 7,8,9,10,1 };
//
//	int sz = sizeof(a) / sizeof(a[0]);
//
//	
//	printf("函数外计算数组大小为：%d\n", sz);
//	printf("sizeof(a)=%zd\n", sizeof(a));
//	printf("sizeof(a[0])=%zd\n\n", sizeof(a[0]));
//	text1(a);
//	return 0;
//}

//#include <stdlib.h>
//#include <time.h>
/*
*冒泡排序
冒泡排序的核⼼思想就是：两两相邻的元素进⾏⽐较
*/
//int main()
//{
//	int a[100000] = { 0 };
//	
//	int sz = sizeof(a) / sizeof(a[0]);
//
//	int* p = a;
//
//	srand((unsigned)time(NULL));
//	printf("使用随机数据填充数组：\n");
//	for (int i = 0; i < sz; i++)
//	{
//		a[i]= rand();
//	}
//	printf("填充完成\n");
//	for (int i = 0; i < sz; i++)
//	{
//		//printf("a[%d] = %d ", i, a[i]);
//	}
//	printf("\n排序开始\n" );
//	
//	for (int i = 0; i < sz-1; i++)
//	{
//		int flag = 1;
//		for (int j = 0; j < sz-1-i; j++)
//		{
//			if (a[j]> a[j+1])
//			{
//				flag = 0;
//				int temp = a[j];
//				a[j]= a[j + 1];
//				a[j + 1] = temp;
//			}
//
//		}
//		if (flag == 1)
//		{
//			//排序完成一趟，没有发生变动证明序列已经是有序的
//			//break;
//		}
//	}
//	//排序规则检查
//	for (int i = 1; i < sz; i++)
//	{
//		if (a[i - 1] > a[i])
//		{
//			printf("\n\n<<<<<排序错误：a[%d] > a[%d]>>>>>\n\n", i - 1, i);
//			break;
//		}
//			
//	}
//	printf("\n排序完成：\n");
//	for (int i = 0; i < sz; i++)
//	{
//		//printf("a[%d] = %d ", i, a[i]);
//	}
//	return 0;
//}

/*
*二级指针及其解引用
*/
//int main()
//{
//	int a = 10;
//	int* p = &a;
//	int** pp = &p;
//
//	printf("&a=%p\n", &a);
//	printf("p=%p\n", p);
//
//	printf("&p=%p\n", &p);
//	printf("pp=%p\n", pp);
//
//	printf("*pp=%p\n", *pp);
//	printf("**pp=%d\n", **pp);
//	return 0;
//}

/*
*指针数组
* 指针数组是指针还是数组
* 整型数组，是存放整型的数组，字符数组是存放字符的数组。
* 那指针数组呢？是存放指针的数组
* 我们可以使用指针数组模拟出二维数组的功能
* 但是模拟出来的数组并不具备数组地址连续的特点
* 
*/

int	main()
{
	int a1[] = { 1,2,3 };
	int a2[] = { 4,5,6 ,40};
	int a3[] = { 7,8,9 };

	int* a[3] = { a1 ,a2 ,a3 };
	int sz = sizeof(a) / sizeof(a[0]);
	////模拟二维数组
	printf("sizeof(a)=%zd\n", sizeof(a));

	printf("sizeof(&a[0])=%zd\n", sizeof(&a[0]));
	printf("sizeof(a[0])=%zd\n", sizeof(a[0]));
	printf("sizeof(a1)=%zd\n", sizeof(a1));

	printf("sizeof(&a[1])=%zd\n", sizeof(&a[1]));
	printf("sizeof(a[1])=%zd\n", sizeof(a[1]));
	printf("sizeof(a2)=%zd\n", sizeof(a2));
	printf("sizeof(a[1])/sizeof(a[1][0])=%zd\n", sizeof(a[1]) / sizeof(a[1][0]));
	for (int i = 0; i < sz; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%d\t", a[i][j]);
		}
		printf("\n");
	}

	int b[5][5] = { 0 };//真二维数组
	printf("sizeof(&b[0])=%zd\n", sizeof(&b[0]));
	printf("sizeof(b[0])=%zd\n", sizeof(b[0]));
	printf("sizeof(b[0])/sizeof(b[0][0])=%zd\n", sizeof(b[0]) / sizeof(b[0][0]));
	return	0;
}
